#include "Caisse.h"
#include "Terrain.h"
#include <stdlib.h>

void  caiInit(Caisse *pCai)
{
  pCai->x=pCai->y=0;
  pCai->etat_c=marcheCaisse;
  pCai->suivant=NULL;
}

void caiGauche(Caisse *pCai, Terrain *pTer)
{
  if( terEstPositionCaisseValide( pTer, pCai->x-1, pCai->y))
		pCai->x--;
}

void caiDroite(Caisse *pCai, const Terrain *pTer)
{
	if (terEstPositionCaisseValide( pTer, pCai->x+1, pCai->y))
		pCai->x++;
}

void caiHaut(Caisse *pCai, const Terrain *pTer)
{
	if (terEstPositionCaisseValide( pTer, pCai->x, pCai->y-1))
	  {
		pCai->y--;
	  }
}

void caiBas(Caisse *pCai, const Terrain *pTer)
{
	if (terEstPositionCaisseValide( pTer, pCai->x, pCai->y+1))
		pCai->y++;
}

int caiGetX(const Caisse *pCai)
{
	return pCai->x;
}

int caiGetY(const Caisse *pCai)
{
	return pCai->y;
}
etatCaisse caiGetEtat(const Caisse *pCai)
{
  return pCai->etat_c;
}

etatCaisse caiGetEtatTerrain(const Terrain *pTer, const int x, const int y)
{
  etatCaisse etat;
  if(x>0 && y>0) 
    {
      if((pTer->tab[x-1][y]=='#' &&  pTer->tab[x][y-1]=='#') || (pTer->tab[x-1][y]=='#' &&  pTer->tab[x][y-1]=='*') ||\
	 (pTer->tab[x-1][y]=='*' &&  pTer->tab[x][y-1]=='*') || (pTer->tab[x+1][y]=='#' &&  pTer->tab[x][y+1]=='#')\
	  ||(pTer->tab[x-1][y]=='#' &&  pTer->tab[x][y-1]=='*') || (pTer->tab[x-1][y]=='#' &&  pTer->tab[x][y+1]=='*'))
	etat=1;
        else
	  etat=0;
    }
    if(pTer->tab[x][y]=='X')
      etat=2;
    return etat;
}

int  caiRecherche(Caisse *pCai, int x, int y)
{     
  Caisse *tmp=pCai;
  while(tmp!=NULL)
   {
     if(tmp->x==x && tmp->y==y)
       {
	 return 1;
       }
     tmp=tmp->suivant;
   }
  return 0;
}

static void caiAjout(Caisse *pCai,int x, int y, etatCaisse e)
{
  Caisse *caiNouveau, *tmp;
  caiNouveau=(Caisse *)malloc(sizeof(Caisse));
  caiNouveau->x=x;
  caiNouveau->y=y;
  caiNouveau->etat_c=e;
  if(pCai==NULL)
    pCai=caiNouveau;
  else
    {
      tmp=pCai;
      while(tmp->suivant!=NULL)
	{
	  tmp=tmp->suivant;
	}
      tmp->suivant=caiNouveau;
    }
  
}

void caiRecupereTer(Caisse *pCai, const Terrain *pTer)
{
  int x,y;
  etatCaisse etat;
  for(y=0;y<getDimY(pTer);y++)
    for(x=0;x<getDimX(pTer);x++)
      {
	if(pTer->tab[y][x]=='*')
	  {
	    caiAjout(pCai,x,y,caiGetEtatTerrain(pTer,x,y));
	  }
      }
 }
